#ifndef MODBUSTCP_MASTER_H_
#define MODBUSTCP_MASTER_H_

#include "../../DATA_Function.h"
#include "../MODBUS_Global.h"

/*该类型卡件私有属性结构体定义*/
typedef struct {
	int Send_MaxTime;					//< 从缓存区发送的最大等待时间（ms）
	int Recv_MaxTime;					//< 从缓存区接收的最大等待时间（ms）
}MODBUSTCP_MASTER_List_Par_t;

/*卡件可调属性结构体定义*/ 
typedef struct {
	unsigned char ModuleAddr;			//< 从机模件地址 
	int Card_Period;					//< 卡件运算周期相对于基准周期的倍数
	unsigned short StartAddrOf_0x01;	//< 1号功能码对应测点起始地址
	unsigned short StartAddrOf_0x02;	//< 2号功能码对应测点起始地址
	unsigned short StartAddrOf_0x03;	//< 3号功能码对应测点起始地址
	unsigned short StartAddrOf_0x04;	//< 4号功能码对应测点起始地址
	unsigned short StartAddrOf_0x05;	//< 5号功能码对应测点起始地址
	unsigned short StartAddrOf_0x06;	//< 6号功能码对应测点起始地址
	unsigned short StartAddrOf_0x0F;	//< 15号功能码对应测点起始地址
	unsigned short StartAddrOf_0x10;	//< 16号功能码对应测点起始地址
}MODBUSTCP_MASTER_Par_t;

/*卡件不可调属性结构体定义*/
typedef struct {
	char ModuleIP[IP_STR_LENGTH];		//< 从机IP地址
	bool Is_Double;						//< 是否为双字MODBUS（true-是，false-否）双字MODBUS为用四个字节发送一个浮点数
	unsigned short FunCodeNumOf_0x01;	//< 1号功能码对应测点数量（MODBUS主站的DI点）
	unsigned short FunCodeNumOf_0x02;	//< 2号功能码对应测点数量（MODBUS主站的DI点）
	unsigned short FunCodeNumOf_0x03;	//< 3号功能码对应测点数量（MODBUS主站的AI点）
	unsigned short FunCodeNumOf_0x04;	//< 4号功能码对应测点数量（MODBUS主站的AI点）
	bool FunCodeNumOf_0x05;				//< 5号功能码对应测点数量（0或1个）（MODBUS主站的DO点）
	bool FunCodeNumOf_0x06;				//< 6号功能码对应测点数量（0或1个）（MODBUS主站的AO点）
	unsigned short FunCodeNumOf_0x0F;	//< 15号功能码对应测点数量（MODBUS主站的DO点）
	unsigned short FunCodeNumOf_0x10;	//< 16号功能码对应测点数量（MODBUS主站的AO点）
}MODBUSTCP_MASTER_Sta_t;

/*卡件属性结构体定义*/
struct MODBUSTCP_MASTER_T
{
	Card_Base_t Base;					//< 卡件基本属性结构体
	MODBUSTCP_MASTER_Par_t Par;			//< 卡件可调属性结构体
	MODBUSTCP_MASTER_Sta_t Sta;			//< 卡件不可调属性结构体
};

extern MODBUSTCP_MASTER_T* MODBUSTCP_MASTER_t;
extern MODBUSTCP_MASTER_List_Par_t MODBUSTCP_MASTER_List_Par;

/*函数*/
void CARD_WORK(MODBUSTCP_MASTER)();								//< modbus-485主站工作函数
void *tMODBUSTCP_MASTER_Work_Thread(void* arg);					//< MODBUS-485主站工作线程
bool MODBUSTCP_MASTER_RW(MODBUSTCP_MASTER_T* base, int fd);		//< MODBUS-485读写函数
bool MODBUSTCP_MASTER_Funcode0x01_0x02_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch);				//< 功能码1、功能码2工作函数
bool MODBUSTCP_MASTER_Funcode0x03_0x04_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch, bool Is_Double);//< 功能码3、功能码4工作函数
bool MODBUSTCP_MASTER_Funcode0x05_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch);						//< 功能码5工作函数
bool MODBUSTCP_MASTER_Funcode0x06_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch);						//< 功能码6工作函数
bool MODBUSTCP_MASTER_Funcode0x0F_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch);						//< 功能码15工作函数
bool MODBUSTCP_MASTER_Funcode0x10_Work(int fd, unsigned short num, unsigned char ModuleAddr, unsigned char Funcode, unsigned short StartAddr, unsigned short RWNum, void* Ch, bool Is_Double);		//< 功能码16工作函数
int CHANGE_CARD_LIST_PAR(MODBUSTCP_MASTER)(Card_Base_t* arg, void** Data);								//< 修改该类型卡件属性
int CHANGE_CARD_PAR(MODBUSTCP_MASTER)(Card_Base_t* arg, void** Data);									//< 在线修改卡件参数函数
int INIT_CARD_STA(MODBUSTCP_MASTER)(Card_Base_t* arg, void** Data);										//< 初始化卡件不可调参数结构体

#endif
